iT邦幫忙

1

Django框架中,template調用view中的函數

  • 分享至 

  • xImage
  •  

前因是在寫html的時候,需要訪問第三方的資料庫,這個時候,直接使用html進行訪問會出現cross的bug,為了使用no-cross的模式,就只能使用js的fetch接口,但是發現,使用fetch結果之後,是沒有報錯了,但是也沒有收到回傳信息;無奈之下,就開始挖掘標題中的框架功能了;
所以就尋求使用template調用 view中的函數,view中是後台的函數,可以直接使用python 的request接口實現訪問第三方的url;

我看了一些論壇和視頻,最後通過摸索找到了可行的方法:

第一步:設定local的url路徑:
首先很重要的是了解urls.py中的path()接口的意義:請看官方文檔;
https://docs.djangoproject.com/en/4.0/ref/urls/
這裡關鍵的參數是:route,route如果帶參數的話,那摩需要注意參數的格式,會影響到調用哪個view中的函數;
當然,為了能夠靈活使用的話,肯定是要帶參數的,以最常用的str來帶入(如果要傳list,也可以先轉成str,再帶入);
比如我需要查詢一個數據庫的數據:

path('link_db/<str:dbName>', views.link_db, name='link_db'),

加一條這個path,如果沒有link_db的話,要先在template底下,新建一個link_db的文件夾;

第二步:
在views.py中實現接口:

def link_db(request, dbName):
"""View function for home page of site."""
if dbName == 'test':
dbManager.Set_Server('test')
else:
dbManager.Set_Server('real')
# print('dbManager.shedsMapToPaths:', dbManager.shedsMapToPaths)
dbManager.getAllShedWithPaths()
# print('dbManager.shedsMapToPaths:', dbManager.shedsMapToPaths)
print('get all sheds')
context = {
'shedsMapToPaths': json.dumps(dbManager.shedsMapToPaths),
}
# print(context)
# Render the HTML template index.html with the data in the context variable
return render(request, 'link_db/link_db.html', context=context)

第三步:
在template的html中發送請求:
兩種做法:
第一種:form格式:

<form action="/gpxManage/link_db/test" method="post">
{% csrf_token %}
<button type="submit" name='linkTestDB' id="button_linkTestDB"> </button>
</form>

其中我的‘gpxManage’是當前的html所在的tmplate的目錄:
(這個是重點,目錄搞錯了,就是route參數錯誤,就不會調用到想要調用的函數,
如果實在不知道目錄是怎麼楊的,可以在html中打印一下目錄參數:
console.log(“{% url {‘link_db’}%}”);

我的目錄圖是下面這樣的:
https://ithelp.ithome.com.tw/upload/images/20220609/20139212zwRvh08Lq0.png

用post的話,就需要加入{% csrf_token %},get的話,不用;
form格式的話,需要使用一個submit,一般使用一個submit的按鈕進行發送;
第二種:js的request格式:
由於js格式,我的源碼中使用在調用其他的功能,我就貼一下,三個原始碼:
urls.py中:

urlpatterns = [
path('', views.index, name='index'),
path('link_db/<str:dbName>', views.link_db, name='link_db'),
###paths filter by , 
path('link_db/delete_shed/<str:shedId>', views.delete_shed, name='delete_shed'),

這次案例使用delete_shed這個接口:
views.py中:

def delete_shed(request, shedId):
# filter paths
print('shedId:', shedId)
if dbManager.removeShed(shedId):
print('delete success')
pass
# todo : return the response
context = {
'shedsMapToPaths': json.dumps(dbManager.shedsMapToPaths),
}
return render(request, 'link_db/link_db.html', context=context)

然後html的路徑是:
https://ithelp.ithome.com.tw/upload/images/20220609/20139212pNuWgZyVbL.png

js調用的源碼是:

console.log('delete shed in server')
function reqListener() {
// console.log(this.responseText);
}

//todo send requests
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", 'delete_shed'+'/'+shedId);
oReq.send();

因為這個path的參數和上一個link_db的參數都是str:xxx,所以必須要加一個目錄,才能被訪問到,所以我新建了一個空的dir : delete_shed,如圖,是一個空的目錄;
https://ithelp.ithome.com.tw/upload/images/20220609/20139212MTw61ye378.png

總結:
我在stack和youtube上面都看到過相關的解答,但是都在實操的時候,遇到bug;所以就寫了這個傻瓜式操作的文章,希望大家不用像我一樣,被卡好幾天;


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言